package Proxy;

/**
 * 信息查询接口
 */
public interface Searcher {
    String doSearch(String userId, String keyword);
}

/**
 * 真实查询类，实现核心查询功能
 */
class RealSearcher implements Searcher {
    @Override
    public String doSearch(String userId, String keyword) {
        System.out.println("用户'" + userId + "'使用关键词'" + keyword + "'查询商务信息");
        // 模拟实际查询结果
        return "查询结果: [" + keyword + "]的相关商务信息";
    }
}

/**
 * 身份验证类
 */
class AccessValidator {
    public boolean validate(String userId) {
        System.out.println("验证用户'" + userId + "'身份");
        // 模拟验证过程，假设只有"admin"和"user"是合法用户
        return "admin".equals(userId) || "user".equals(userId);
    }
}

/**
 * 日志记录类
 */
class Logger {
    public void log(String userId) {
        System.out.println("更新数据库，用户'" + userId + "'查询次数加1");
    }
}

/**
 * 代理查询类，添加身份验证和日志记录功能
 */
class ProxySearcher implements Searcher {
    private RealSearcher searcher = new RealSearcher();
    private AccessValidator validator;
    private Logger logger;

    public ProxySearcher() {
        this.validator = new AccessValidator();
        this.logger = new Logger();
    }

    @Override
    public String doSearch(String userId, String keyword) {
        // 1. 身份验证
        if (!validator.validate(userId)) {
            return "错误：身份验证失败，您无权使用查询系统！";
        }

        // 2. 执行实际查询
        String result = searcher.doSearch(userId, keyword);

        // 3. 记录日志
        logger.log(userId);

        // 4. 返回结果
        return result;
    }
}

/**
 * 客户端测试
 */
class ProxyClient {
    public static void main(String[] args) {
        // 创建代理查询对象
        Searcher searcher = new ProxySearcher();

        // 测试合法用户查询
        System.out.println("===== 测试合法用户 =====");
        System.out.println(searcher.doSearch("admin", "人工智能"));
        System.out.println(searcher.doSearch("user", "大数据"));

        // 测试非法用户查询
        System.out.println("\n===== 测试非法用户 =====");
        System.out.println(searcher.doSearch("guest", "云计算"));
    }
}